# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# NOTE: This file is auto generated by the elixir code generator program.
# Do not edit this file manually.

defmodule GoogleApi.StorageTransfer.V1.Model.Schedule do
  @moduledoc """
  Transfers can be scheduled to recur or to run just once.

  ## Attributes

  *   `endTimeOfDay` (*type:* `GoogleApi.StorageTransfer.V1.Model.TimeOfDay.t`, *default:* `nil`) - The time in UTC that no further transfer operations are scheduled. Combined with schedule_end_date, `end_time_of_day` specifies the end date and time for starting new transfer operations. This field must be greater than or equal to the timestamp corresponding to the combination of schedule_start_date and start_time_of_day, and is subject to the following: * If `end_time_of_day` is not set and `schedule_end_date` is set, then a default value of `23:59:59` is used for `end_time_of_day`. * If `end_time_of_day` is set and `schedule_end_date` is not set, then INVALID_ARGUMENT is returned.
  *   `repeatInterval` (*type:* `String.t`, *default:* `nil`) - Interval between the start of each scheduled TransferOperation. If unspecified, the default value is 24 hours. This value may not be less than 1 hour.
  *   `scheduleEndDate` (*type:* `GoogleApi.StorageTransfer.V1.Model.Date.t`, *default:* `nil`) - The last day a transfer runs. Date boundaries are determined relative to UTC time. A job runs once per 24 hours within the following guidelines: * If `schedule_end_date` and schedule_start_date are the same and in the future relative to UTC, the transfer is executed only one time. * If `schedule_end_date` is later than `schedule_start_date` and `schedule_end_date` is in the future relative to UTC, the job runs each day at start_time_of_day through `schedule_end_date`.
  *   `scheduleStartDate` (*type:* `GoogleApi.StorageTransfer.V1.Model.Date.t`, *default:* `nil`) - Required. The start date of a transfer. Date boundaries are determined relative to UTC time. If `schedule_start_date` and start_time_of_day are in the past relative to the job's creation time, the transfer starts the day after you schedule the transfer request. **Note:** When starting jobs at or near midnight UTC it is possible that a job starts later than expected. For example, if you send an outbound request on June 1 one millisecond prior to midnight UTC and the Storage Transfer Service server receives the request on June 2, then it creates a TransferJob with `schedule_start_date` set to June 2 and a `start_time_of_day` set to midnight UTC. The first scheduled TransferOperation takes place on June 3 at midnight UTC.
  *   `startTimeOfDay` (*type:* `GoogleApi.StorageTransfer.V1.Model.TimeOfDay.t`, *default:* `nil`) - The time in UTC that a transfer job is scheduled to run. Transfers may start later than this time. If `start_time_of_day` is not specified: * One-time transfers run immediately. * Recurring transfers run immediately, and each day at midnight UTC, through schedule_end_date. If `start_time_of_day` is specified: * One-time transfers run at the specified time. * Recurring transfers run at the specified time each day, through `schedule_end_date`.
  """

  use GoogleApi.Gax.ModelBase

  @type t :: %__MODULE__{
          :endTimeOfDay => GoogleApi.StorageTransfer.V1.Model.TimeOfDay.t() | nil,
          :repeatInterval => String.t() | nil,
          :scheduleEndDate => GoogleApi.StorageTransfer.V1.Model.Date.t() | nil,
          :scheduleStartDate => GoogleApi.StorageTransfer.V1.Model.Date.t() | nil,
          :startTimeOfDay => GoogleApi.StorageTransfer.V1.Model.TimeOfDay.t() | nil
        }

  field(:endTimeOfDay, as: GoogleApi.StorageTransfer.V1.Model.TimeOfDay)
  field(:repeatInterval)
  field(:scheduleEndDate, as: GoogleApi.StorageTransfer.V1.Model.Date)
  field(:scheduleStartDate, as: GoogleApi.StorageTransfer.V1.Model.Date)
  field(:startTimeOfDay, as: GoogleApi.StorageTransfer.V1.Model.TimeOfDay)
end

defimpl Poison.Decoder, for: GoogleApi.StorageTransfer.V1.Model.Schedule do
  def decode(value, options) do
    GoogleApi.StorageTransfer.V1.Model.Schedule.decode(value, options)
  end
end

defimpl Poison.Encoder, for: GoogleApi.StorageTransfer.V1.Model.Schedule do
  def encode(value, options) do
    GoogleApi.Gax.ModelBase.encode(value, options)
  end
end
